#include <iostream>
#include <signal.h>
#include <unistd.h>
#include <assert.h>

using namespace std;
void catchSig(int signal)
{
    cout << "捕获到信号：" << signal << endl;
}

static void printPending(sigset_t &pending)
{
    for (int sig = 1; sig <= 31; sig++)
    {
        if (sigismember(&pending, sig))
        {
            cout << "1";
        }
        else
        {
            cout << "0";
        }
    }
    cout << endl;
}

static void blockSig(int sig)
{
    sigset_t bset;
    sigemptyset(&bset);
    sigaddset(&bset, sig);
    int n = sigprocmask(SIG_BLOCK, &bset, nullptr);
    assert(n == 0);
    (void)n;
}

int main()
{
    for (int n = 1; n <= 31; n++)
    {
        blockSig(n);
    }

    while (1)
    {
        sigset_t pending;
        sigpending(&pending);
        printPending(pending);
        sleep(1);
    }

    //--------------------------------------------------
    // signal(2,catchSig);

    // sigset_t bset,obset;
    // sigset_t pending;

    // sigemptyset(&bset);
    // sigemptyset(&obset);
    // sigemptyset(&pending);

    // sigaddset(&bset,2);

    // int n = sigprocmask(SIG_BLOCK,&bset,&obset);
    // assert(n==0);
    // (void)n;

    // cout<<"block 2号信号成功："<<getpid()<<endl;

    // int count = 0;
    // while(true)
    // {
    //     sigpending(&pending);
    //     printPending(pending);
    //     sleep(1);
    //     count++;

    //     if(count == 10)
    //     {
    //         cout << "解除对于2号信号的block" << endl;
    //         int n = sigprocmask(SIG_SETMASK,&obset,nullptr);
    //         assert(n==0);
    //         (void)n;
    //     }
    // }
    //-------------------------------------------
    // for(int i = 1;i<=31;i++)
    // {
    //     signal(i,catchSig);
    // }
    // while(1)
    // {
    //     sleep(1);
    // }
    return 0;
}